package com.ssm.changeunit.command;

import com.ssm.changeunit.*;
import com.ssm.changeunit.persistance.ChangeUnitDAO;
import com.ssm.changeunit.persistance.DatabaseManager;
import com.ssm.changeunit.persistance.PersistanceException;
import com.ssm.changeunit.persistance.TagDAO;
import com.ssm.changeunit.persistance.TagDTO;
import java.util.List;
import org.apache.log4j.Logger;


/**
 * 
 * @author 시리우스
 */
public class TagCommandWorker extends CommandWorker {
    private Logger log = Logger.getLogger(TagCommandWorker.class);

    public TagCommandWorker () {
    }

    public void work (CommandWorkerOptions commandWorkerOptions) throws CommandWorkerException {
        if( commandWorkerOptions == null )
            throw new CommandWorkerException("Option이 null입니다.");
        
        if( !commandWorkerOptions.hasCommandWorkerOption("type") )
            throw new CommandWorkerException("Type Option이 존재하지 않습니다.");
        
        String[] typeItems = null;
        String[] nameItems = null;
        String[] changeuntItems = null;
                
        // type option을 꺼내옵니다.
        CommandWorkerOption typeCommandWorkerOption = commandWorkerOptions.getCommandWorkerOption("type");
        
        // type option에 해당하는 item들을 가져옵니다.
        typeItems = typeCommandWorkerOption.getValues();
        nameItems = null;
        
        // item의 값이 없는 경우
        if( typeItems.length == 0 )
            throw new CommandWorkerException("Type 값이 존재하지 않습니다.");
        
        try {
            if(!DatabaseManager.getInstance().isExists())
                throw new CommandWorkerException("데이터베이스가 존재하지 않습니다.");
        }
        catch(PersistanceException ex) {
            throw new CommandWorkerException(ex);
        }
        
        if(typeItems[0].equals("add") || typeItems[0].equals("delete")) {
            if( !commandWorkerOptions.hasCommandWorkerOption("name") )
                throw new CommandWorkerException("Name Option이 존재하지 않습니다.");
            
            // name option을 꺼내옵니다.
            CommandWorkerOption nameCommandWorkerOption = commandWorkerOptions.getCommandWorkerOption("name");

            // name option에 해당하는 item들을 가져옵니다.
            nameItems = nameCommandWorkerOption.getValues();

            // name 값이 없는 경우
            if( nameItems.length == 0 )
                throw new CommandWorkerException("Name 값이 존재하지 않습니다.");
        }
        
        if(typeItems[0].equals("add")) {
            if( !commandWorkerOptions.hasCommandWorkerOption("changeunit") )
                throw new CommandWorkerException("Changeunit Option이 존재하지 않습니다.");
            
            // changeunit option을 꺼내옵니다.
            CommandWorkerOption changeunitCommandWorkerOption = commandWorkerOptions.getCommandWorkerOption("changeunit");

            // changeunit option에 해당하는 item들을 가져옵니다.
            changeuntItems = changeunitCommandWorkerOption.getValues();

            // item의 값이 없는 경우
            if( changeuntItems.length == 0 )
                throw new CommandWorkerException("Changeunit 값이 존재하지 않습니다.");
        }
        
        // 데이터베이스 체크
        log.debug("데이터베이스가 존재하는지 검사합니다.");
        
        try {
            if(!DatabaseManager.getInstance().isExists())
                throw new CommandWorkerException("데이터베이스가 존재하지 않습니다.");
        }
        catch(PersistanceException ex) {
            throw new CommandWorkerException(ex);
        }
        
        try {
            // Type이 Add인 경우
            if(typeItems[0].equals("add")) {
                // ChangeUnit이 존재하는지 검사
                ChangeUnitDAO changeUnitDAO = new ChangeUnitDAO();

                if( changeUnitDAO.find(changeuntItems[0]) == null )
                    throw new CommandWorkerException("ChangeUnit이 존재하지 않습니다. ChangeUnitId: " + changeuntItems[0]);

                // Tag가 있는지 검사
                TagDAO tagDAO = new TagDAO();

                if( tagDAO.find(nameItems[0]) != null )
                    throw new CommandWorkerException("이미 Tag가 존재합니다. Tag Name: " + nameItems[0]);

                // Tag 삽입
                TagDTO tagDTO = new TagDTO();
                tagDTO.setTagName(nameItems[0]);
                tagDTO.setChangeUnitId(changeuntItems[0]);

                tagDAO.insert(tagDTO);
            }
            
            // Type이 Delete인 경우
            else if(typeItems[0].equals("delete")) {
                // Tag가 있는지 검사
                TagDAO tagDAO = new TagDAO();

                if( tagDAO.find(nameItems[0]) == null )
                    throw new CommandWorkerException("Tag가 존재하지 않습니다. Tag Name: " + nameItems[0]);

                // Tag 삭제
                tagDAO.delete(nameItems[0]);
            }
            
            // Type이 List 경우
            else if(typeItems[0].equals("list")) {
                // Tag가 있는지 검사
                TagDAO tagDAO = new TagDAO();
                
                List<TagDTO> tagDTOs = tagDAO.list();
                
                for(TagDTO tagDTO : tagDTOs) 
                    log.info("Tag Name: " + tagDTO.getTagName() + " ChangeUnit ID: " + tagDTO.getChangeUnitId());
            }
        }
        catch(PersistanceException ex) {
            throw new CommandWorkerException(ex);
        }
    }
}

